/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package core;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;
import utils.Utils;
import view.FunctionMenu;
import view.ViewManager;

/**
 *
 * @author Kvest
 */
public class Order2 extends Order 
{
    public static final String CLASS_NAME = "IMAP.Net.DispOrder2";
    
    // Агентские.
    private String agentPay;

    // Список доп. услуги.
    private Vector features;

    // Название агентской программы.
    private String agentName;

    //Телефон диспетчера
    private String dispPhone;

    // Цвет класса автомобиля.
    private int colorClass;
        
    // Класс автомобиля.
    private String autoClass;

    // Название клиента.
    private String clientName;

    // Квитанция обязательна.
    private boolean receiptMustHave;
    
    public Order2(int _orderID)
    {
        super(_orderID);
        
        agentPay = "";
        features = new Vector();
        agentName = "";
        dispPhone = "";
        colorClass = 0;
        autoClass = "";
        clientName  = "";
        receiptMustHave = false;
    }
    
    public Order2(byte[] data) throws IOException
    { 
        this(-1);
       
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(bais);

        try
        {  
            readFields(dis);
        }
        finally
        {
            try
            {
                dis.close();
                bais.close();
            }catch(Exception ex){}
        }       
    }
    
    protected void readFields(DataInputStream dis) throws IOException{
        //int orderID;
        orderID = dis.readInt();
        //byte clientType;
        clientType = dis.readByte();
        //long date;//Дата подачи заказа
        date = dis.readLong();
        //double fare;//Цена поездки
        fare = dis.readDouble();
        //String dispatcherName;//Имя диспетчера
        dispatcherName = dis.readUTF();
        //String phoneNumber;//Телефон заказчика
        phoneNumber = dis.readUTF();
        //String address;//Массив адресов
        byte[] tmp = new byte[ dis.readInt()];
        dis.read(tmp);
        address = new String(tmp);
        //int count;//Количество элементов в массиве адресов
        count = dis.readInt();
        //int status
        status = dis.readInt();
        //String comments;
        comments = dis.readUTF();
        //double bonusSum;
        bonusSum = dis.readDouble();
        //String region;
        region = dis.readUTF();
        //String flat;
        flat = dis.readUTF();
        //String parade;
        parade = dis.readUTF();
        //String building;
        building = dis.readUTF();
        // String partnerPreffix;
        partnerPreffix = dis.readUTF();
        //int autoTariffClassUID;
        autoTariffClassUID = dis.readInt();
        //String agentPay;
        agentPay = dis.readUTF();
        //Vector features;
        int size = dis.readInt();
        for (int i = 0; i < size; ++i)
        {
            features.addElement(dis.readUTF());
        }

        //String agentName;
        agentName = dis.readUTF();

        //String dispPhone;
        dispPhone = dis.readUTF();

        //int colorClass;
        colorClass = dis.readInt();

        //String autoClass;
        autoClass = dis.readUTF();

        //String clientName;
        clientName = dis.readUTF();

        //boolean receiptMustHave;
        receiptMustHave = dis.readBoolean();

        //folder
        folder = dis.readUTF();
    }
    
    protected void writeFields(DataOutputStream dos) throws IOException {
        //int orderID;
        dos.writeInt(orderID);
        //byte clientType;
        dos.writeByte(clientType);
        //long date;//Дата подачи заказа
        dos.writeLong(date);
        //double fare;//Цена поездки
        dos.writeDouble(fare);
        //String dispatcherName;//Имя диспетчера
        dos.writeUTF(dispatcherName);
        //String phoneNumber;//Телефон заказчика
        dos.writeUTF(phoneNumber);
        //String address;//Массив адресов
        byte[] tmp = address.getBytes();
        dos.writeInt(tmp.length);
        dos.write(tmp);
        //int count;//Количество элементов в массиве адресов
        dos.writeInt(count);
        //int status
        dos.writeInt(status);
        //String comments;
        dos.writeUTF(comments);
        //double bonusSum;
        dos.writeDouble(bonusSum);
        //String region;
        dos.writeUTF(region);
        //String flat;
        dos.writeUTF(flat);
        //String parade;
        dos.writeUTF(parade);
        //String building;
        dos.writeUTF(building);
        // String partnerPreffix;
        dos.writeUTF(partnerPreffix);
        //int autoTariffClassUID;
        dos.writeInt(autoTariffClassUID);
        //String agentPay;
        dos.writeUTF(agentPay);
        //Vector features;
        dos.writeInt(features.size());
        for (int i = 0; i < features.size(); ++i)
        {
            dos.writeUTF((String)features.elementAt(i));
        }

        //String agentName;
        dos.writeUTF(agentName);

        //String dispPhone;
        dos.writeUTF(dispPhone);

        //int colorClass;
        dos.writeInt(colorClass);

        //String autoClass;
        dos.writeUTF(autoClass);

        //String clientName;
        dos.writeUTF(clientName);

        //boolean receiptMustHave;
        dos.writeBoolean(receiptMustHave);

        //folder
        dos.writeUTF(folder);
    }
    
    public byte[] toByte()
    {
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(result);
     
        try
        {
            writeFields(dos);

            return result.toByteArray();
        }
        catch(IOException ioex)
        {
            return (new byte[]{});
        }
        finally
        {
            try
            {
                dos.close();
                result.close();
            }catch(Exception ex){}
        }
    }
    
    public String getPreOrderDetails()
    {
        String result = super.getPreOrderDetails();
        if (!features.isEmpty())
        {
            result += ("Доп. услуги : ");
            for (int i = 0; i < features.size(); ++i)
            {
                result += ((i == 0 ? "" : ", ") + (String)features.elementAt(i));
            }
            result += ";\n";
        }
        
        return result;
    }
    
    public String getDetailsText(boolean fullData, String type)
    {       
        String result = "";

        if (!type.equals(""))
        {
            result += (type+'\n');
        }
    
        int menuType = ViewManager.getViewManager().getFunctionMenuType();
        
        //Если для Черновцов
        if (menuType == FunctionMenu.CHERNOVTSI_TYPE)
        {
            return getChernovtsiDetailsText();
        }
        
        //Если короткий заказ для донецка - особый формат
        if ((menuType == FunctionMenu.DONETSK_TYPE) && (!Settings.getSettings().isFullOrder()))
        {
            return getDonetskShortDetailsText();
        }
        
        //[время]([цена])[Класс авто][улица]д[дом],п[парадная],кв[квартира]>[следующий адрес]\[примечания]
        String AutoTariffClassUIDStr = "";
        AutoTariffClassUIDStr += "[" + getAutoClass() + "]";
        
        //Префикс партнера и Дата 
        String tmp = formatPreffix(getPartnerPreffix());
        if (fullData)
        {
            tmp += (Utils.dateToString(getDate()) + "(");
        }
        else
        {
            tmp += (Utils.dateToTimeString(getDate()) + "(");
        }
        
        //цена
        if (menuType == FunctionMenu.KIROVOGRAD_TYPE) {      
            if (getFare()>=0) {
                String bonusSumStr = getBonusSum();             
                if (!bonusSumStr.equals("") && getStatus() != STATE_NEW) {
                    tmp += "Бонусная поездка, доплата " + Double.toString(getFare()) + " грн"; 
                } else {
                    tmp += Double.toString(getFare()) + ")";
                }
            } else {
                tmp += "без суммы)";
            }
        } else {
            if (getFare()>=0)
            {
                tmp += Double.toString(getFare());
                String bonusSumStr = getBonusSum();
                if (!bonusSumStr.equals("") && getStatus() != STATE_NEW)
                {
                    tmp += " в офисе " + bonusSumStr + " грн";
                }
                tmp +=")";
            }
            else
            {
                    tmp += "без суммы)";
            }
        }
        
        tmp += AutoTariffClassUIDStr;
        
        //Адреса
        String[] temp = getAddress();
        for (int j=0;j<temp.length;j++)
        {
            tmp += temp[j];
            if (j==0)
            {
                String tempStr = "";
                //Строение
                tempStr = getBuilding();
                if (!tempStr.equals(""))
                {
                    if (Utils.isNumber(tempStr.charAt(0)))
                    {
                        tmp += ",корп" + tempStr;
                    }
                    else
                    {
                        tmp += ","+tempStr;
                    }
                }
                
                //Парадная
                tempStr = getParade();
                if (!tempStr.equals(""))
                {
                    if (Utils.isNumber(tempStr.charAt(0)))
                    {
                        tmp += ",п" + tempStr;
                    }
                    else
                    {
                        tmp += ","+tempStr;
                    }
                }
                //Квартира
                tempStr = getFlat();
                if (!tempStr.equals(""))
                {
                    if (Utils.isNumber(tempStr.charAt(0)))
                    {
                        tmp += ",кв" + tempStr;
                    }
                    else
                    {
                        tmp += ","+tempStr;
                    }
                }

                //Регион
                String strRegion = getRegion();
                if (!strRegion.equals(""))
                {
                    tmp += "(" + strRegion + ")";
                }
            }
            
            if (j < temp.length-1)
            {
                    tmp += ">";
            }
        }
        //Коментарии
        tmp += "\\" + getComments();
        
        result = tmp + "\\" + getFolder() + '\n';
        
        //Доп услуги
        if (!features.isEmpty())
        {
            result += ("Доп. услуги : ");
            for (int i = 0; i < features.size(); ++i)
            {
                result += ((i == 0 ? "" : ", ") + (String)features.elementAt(i));
            }
            result += ";\n";
        }
        
        if (Settings.getSettings().isFullOrder())
        {
            result += ("Дата : " + Utils.dateToDateString(getDate()) + '\n');
            //Для черновцов не показываем тип клиента, но показываем Дополнительные услуги
            if (!(menuType == FunctionMenu.KIROVOGRAD_TYPE && (folder.equals("Автопоиск"))))
            {
                result += ("Тип клиента : " + getClientTypeString() + '\n'); 
            }
            if (Settings.getSettings().isShowPhone() && !(menuType == FunctionMenu.KIROVOGRAD_TYPE && (folder.equals("Автопоиск")))) 
            {
                if (getPhoneNumber().equals(""))
                {
                    result += "Тел.: нет\n";
                }
                else
                {
                    result += ("Тел. : " + getPhoneNumber() + "\n");
                }
            }
            
            if (menuType != FunctionMenu.KIROVOGRAD_TYPE) {
                result += ("Имя диспетчера : " + getDispatcherName() + '\n');
            }
            
            //Номер диспетчера
            if (!dispPhone.equals("") && (menuType == FunctionMenu.KIROVOGRAD_TYPE))
            {
                result += ("Тел. диспетчера : " + dispPhone + '\n');
            }
            result += ("ID заказа : " + Integer.toString(getOrderID()) + '\n');
        }
        
        return result;
    }
    
    public String getAgentName() {
        return agentName;
    }

    public void setAgentName(String agentName) {
        this.agentName = agentName;
    }

    public String getAgentPay() {
        return agentPay;
    }

    public void setAgentPay(String agentPay) {
        this.agentPay = agentPay;
    }

    public String getAutoClass() {
        return autoClass;
    }

    public void setAutoClass(String autoClass) {
        this.autoClass = autoClass;
    }

    public String getClientName() {
        return clientName;      
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;        
    }

    public int getColorClass() {
        return colorClass;
    }

    public void setColorClass(int colorClass) {
        this.colorClass = colorClass;
    }

    public String getDispPhone() {
        return dispPhone;
    }

    public void setDispPhone(String dispPhone) 
    {         
        this.dispPhone = dispPhone;        
    }

    public boolean isReceiptMustHave() {
        return receiptMustHave;
    }

    public void setReceiptMustHave(boolean receiptMustHave) {
        this.receiptMustHave = receiptMustHave;
    }
    
    public void addFeature(String feature)
    {
        features.addElement(feature);      
    }
    
    public void resetFeatures(Order2 src)
    {
        features.removeAllElements();
        
        for (int i = 0; i < src.features.size(); ++i)
        {
            features.addElement(src.features.elementAt(i));
        }
    }
    
    public String getFeatures()
    {
        String result = "";
        for (int i = 0; i < features.size(); ++i)
        {
            result += ((i == 0 ? "" : ", ") + (String)features.elementAt(i));
        }
        
        return result;
    }
    
    public void copy(Order src) 
    {
        super.copy(src);
        
        if (src instanceof Order2)
        {
            setAgentPay(((Order2)src).getAgentPay());
            resetFeatures((Order2)src);
            setAgentName(((Order2)src).getAgentName());
            setDispPhone(((Order2)src).getDispPhone());
            setColorClass(((Order2)src).getColorClass());
            setAutoClass(((Order2)src).getAutoClass());
            setClientName(((Order2)src).getClientName());
            setReceiptMustHave(((Order2)src).isReceiptMustHave());
        }
    }
}
